package main

import (
	"fmt"
)

// 遥控开关机命令类型
const (
	PowerOn  byte = 0x10 // 遥控开机命令
	PowerOff byte = 0x1F // 遥控关机命令
)

// 校验和计算函数（CHKSUM）
func calculateChecksum(data []byte) []byte {
	var sum int32
	for _, b := range data {
		sum += int32(b)
	}
	checksum := sum % 65536
	checksum = ^checksum + 1
	return []byte{byte(checksum >> 8), byte(checksum & 0xFF)}
}

// 构建遥控开关机命令帧
func buildRemoteControlCommand(commandType byte) []byte {
	soi := []byte{0x7E}    // SOI
	ver := []byte{0x21}    // VER
	adr := []byte{0x01}    // ADR
	cid1 := []byte{0x60}   // CID1: 设备类型 - 分散空调
	cid2 := []byte{0x45}   // CID2: 遥控开关机命令
	length := []byte{0x00, 0x02} // LENGTH（LENID=2）
	commandInfo := []byte{commandType} // COMMAND INFO: 控制类型
	checksum := calculateChecksum(append(soi, append(ver, append(adr, append(cid1, append(cid2, append(length, append(commandInfo, ...)...)...)...)...)
	eoi := []byte{0x0D}    // EOI

	// 拼接完整的命令帧
	commandFrame := append(soi, append(ver, append(adr, append(cid1, append(cid2, append(length, append(commandInfo, append(checksum, eoi...)...)...)...)
	return commandFrame
}

// 构建遥控开关机响应帧
func buildRemoteControlResponse(returnCode byte) []byte {
	soi := []byte{0x7E}    // SOI
	ver := []byte{0x21}    // VER
	adr := []byte{0x01}    // ADR
	cid1 := []byte{0x60}   // CID1: 设备类型 - 分散空调
	rtc := []byte{returnCode} // RTN: 返回码
	length := []byte{0x00, 0x00} // LENGTH (LENID=0)
	checksum := calculateChecksum(append(soi, append(ver, append(adr, append(cid1, append(rtc, append(length, eoi...)...)...)...)
	eoi := []byte{0x0D}    // EOI

	// 拼接完整的响应帧
	responseFrame := append(soi, append(ver, append(adr, append(cid1, append(rtc, append(length, append(checksum, eoi...)...)...)...)
	return responseFrame
}

func main() {
	// 示例：构建遥控开关机命令，遥控开机命令（10H）
	commandFrame := buildRemoteControlCommand(PowerOn)
	fmt.Printf("遥控开机命令帧: %X\n", commandFrame)

	// 示例：构建遥控开关机响应帧，正常返回（RTN=00H）
	responseFrame := buildRemoteControlResponse(0x00)
	fmt.Printf("遥控开关机响应帧: %X\n", responseFrame)
}
